﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NMF.Languages
{
    public interface ITypeVisitor
    {
        void VisitBoolean(BooleanType type);
        void VisitClass(IClass type);
        void VisitEnum(EnumType type);
        void VisitFloat(FloatType type);
        void VisitInteger(IntegerType type);
        void VisitRegexType(RegexType type);
        void VisitString(StringType type);
        void VisitDateTime(DateTimeType type);
        void VisitOther(DataType type);
    }

    public interface ITypeVisitor<T>
    {
        T VisitBoolean(BooleanType type);
        T VisitClass(IClass type);
        T VisitEnum(EnumType type);
        T VisitFloat(FloatType type);
        T VisitInteger(IntegerType type);
        T VisitRegexType(RegexType type);
        T VisitString(StringType type);
        T VisitDateTime(DateTimeType type);
        T VisitOther(DataType type);
    }

    public interface ITypeVisitor<S, T>
    {
        T VisitBoolean(BooleanType type, S parameter);
        T VisitClass(IClass type, S parameter);
        T VisitEnum(EnumType type, S parameter);
        T VisitFloat(FloatType type, S parameter);
        T VisitInteger(IntegerType type, S parameter);
        T VisitRegexType(RegexType type, S parameter);
        T VisitString(StringType type, S parameter);
        T VisitDateTime(DateTimeType type, S parameter);
        T VisitOther(DataType type, S parameter);
    }
}
